/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

import javax.microedition.midlet.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.wireless.messaging.*;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @author Carlos
 */
public class ReceptorSMS extends MIDlet implements Runnable, CommandListener{
    private int recibidos;
    private String encuestas;
    private String puerto;
    private Thread receptor=null;
    private TextBox txtMensaje;
    private Command cmdSalir = new Command("Salir",Command.EXIT, 0);

    //Miembros para el hilo de recepcion
    private boolean endNow=false;
    private MessageConnection conn=null;

    public void startApp() {
        recibidos = 0;
//        encuestas = EncuestasActivas.obtenerEncuestasActivas();
        puerto = this.getAppProperty("Puerto");
        txtMensaje = new TextBox("Receptor SMS", 
                "Recibiendo mensajes en el puerto " + puerto +
                "...\n\nMensajes recibidos: " + recibidos,
                // + "\n\nEncuestas activas:\n" + encuestas,256, TextField.ANY);
                256, TextField.UNEDITABLE);
        Display.getDisplay(this).setCurrent(txtMensaje);
        txtMensaje.addCommand(cmdSalir);
        txtMensaje.setCommandListener(this);
        iniciarRecepcion();
    }

    public void iniciarRecepcion(){
         if(receptor != null)
            return;
        //Iniciar el hilo de recepcion
        receptor = new Thread(this);
        receptor.start();
    }

     public void run(){
        Message msj = null;
        String msjRecibido = null;
        String origen = null;
        String encuesta=null;
        String opcion = null;
        conn = null;
        endNow = false;
        recibidos = 0;
        // Revisar conexion sms
        try{
            conn = (MessageConnection) Connector.open("sms://:"+puerto);
            msj = conn.receive();
            while((msj != null) && (!endNow)){
                if(msj instanceof TextMessage){
                    msjRecibido = ((TextMessage)msj).getPayloadText();
                    System.out.println(msjRecibido);
//                    if (encuestas.indexOf(msjRecibido.substring(0,6)) != -1)
//                    {
                        origen =((TextMessage)msj).getAddress();
                        origen = origen.substring(10, 18);
                        encuesta = msjRecibido.substring(0, 6);
                        opcion = String.valueOf(msjRecibido.charAt(7));
                        System.out.println("Nuevo Mensaje! De: " + origen + " Encuesta: "+encuesta+ " Opcion: "+opcion);

                        //Enviar los datos al servlet
                        enviarDatos(origen, encuesta, opcion);
                        recibidos++;
                        txtMensaje.setString("Recibiendo mensajes en el puerto " + puerto + "...\n\nMensajes recibidos: " + recibidos + "\n\nEncuestas activas:\n" + encuestas);

                        //Recibir el siguiente mensaje
                        msj = conn.receive();
//                    }
                }//End if
            }//End while
        }catch(IOException e){
            System.err.println(e.getMessage());
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public void enviarDatos(String numerotel, String idEncuesta, String respuesta)
    {
        HttpConnection hc = null;
        OutputStream out = null;

        try
        {
            String parametros="id="+idEncuesta+"&" +
                    "numero="+numerotel+"&" +
                    "respuesta="+respuesta;
            String url = this.getAppProperty("UrlServidor") + this.getAppProperty("ServletVoto");
            hc = (HttpConnection)Connector.open(url, Connector.READ_WRITE);
            hc.setRequestMethod(HttpConnection.POST);
            hc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            hc.setRequestProperty("Content-Length", Integer.toString(parametros.length()));
            out = hc.openOutputStream();
            //Enviar los parametros del voto
            out.write(parametros.getBytes());

        }catch(Exception ioe)
        {
            System.err.print(ioe.getMessage());
            ioe.printStackTrace();
        }
        finally
        {
            try
            {
                if( out != null) out.close();
                if(hc != null) hc.close();
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }

        }
    }
     
    public void pauseApp() {       
    }

    public void destroyApp(boolean unconditional) {
        try{
            endNow = true;
            conn.close();
        }catch(IOException ex){
            System.out.println("destroyApp atrapo: ");
            ex.printStackTrace();
        }
    }

     public void commandAction(Command c, Displayable d){
        if(c==cmdSalir){
                destroyApp(true);
                notifyDestroyed();
        }
    }
}

